{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "os.environ['CUDA_VISIBLE_DEVICES'] = '3'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/husein/.local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:516: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:517: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:518: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:519: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:520: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:525: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:542: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:543: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:544: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:545: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:550: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "\n",
    "with open('train-test.json') as fopen:\n",
    "    dataset = json.load(fopen)\n",
    "    \n",
    "with open('dictionary.json') as fopen:\n",
    "    dictionary = json.load(fopen)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_X = dataset['train_X']\n",
    "train_Y = dataset['train_Y']\n",
    "test_X = dataset['test_X']\n",
    "test_Y = dataset['test_Y']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['from', 'to'])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dictionary.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "dictionary_from = dictionary['from']['dictionary']\n",
    "rev_dictionary_from = dictionary['from']['rev_dictionary']\n",
    "\n",
    "dictionary_to = dictionary['to']['dictionary']\n",
    "rev_dictionary_to = dictionary['to']['rev_dictionary']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "GO = dictionary_from['GO']\n",
    "PAD = dictionary_from['PAD']\n",
    "EOS = dictionary_from['EOS']\n",
    "UNK = dictionary_from['UNK']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Rachel Pike : The science behind a climate headline EOS'"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for i in range(len(train_X)):\n",
    "    train_X[i] += ' EOS'\n",
    "    \n",
    "train_X[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'How can I speak in <NUM> minutes about the bonds of women over three generations , about how the astonishing strength of those bonds took hold in the life of a four - year - old girl huddled with her young sister , her mother and her grandmother for five days and nights in a small boat in the China Sea more than <NUM> years ago , bonds that took hold in the life of that small girl and never let go - - that small girl now living in San Francisco and speaking to you today ? EOS'"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for i in range(len(test_X)):\n",
    "    test_X[i] += ' EOS'\n",
    "    \n",
    "test_X[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def pad_second_dim(x, desired_size):\n",
    "    padding = tf.tile([[[0.0]]], tf.stack([tf.shape(x)[0], desired_size - tf.shape(x)[1], tf.shape(x)[2]], 0))\n",
    "    return tf.concat([x, padding], 1)\n",
    "\n",
    "class Translator:\n",
    "    def __init__(self, size_layer, num_layers, embedded_size,\n",
    "                 from_dict_size, to_dict_size, learning_rate, batch_size):\n",
    "        \n",
    "        def cells(size_layer = size_layer, reuse=False):\n",
    "            return tf.nn.rnn_cell.LSTMCell(size_layer,initializer=tf.orthogonal_initializer(),reuse=reuse)\n",
    "        \n",
    "        self.X = tf.placeholder(tf.int32, [None, None])\n",
    "        self.Y = tf.placeholder(tf.int32, [None, None])\n",
    "        self.X_seq_len = tf.count_nonzero(self.X, 1, dtype=tf.int32)\n",
    "        self.Y_seq_len = tf.count_nonzero(self.Y, 1, dtype=tf.int32)\n",
    "        batch_size = tf.shape(self.X)[0]\n",
    "        \n",
    "        encoder_embedding = tf.Variable(tf.random_uniform([from_dict_size, embedded_size], -1, 1))\n",
    "        decoder_embedding = tf.Variable(tf.random_uniform([to_dict_size, embedded_size], -1, 1))\n",
    "        \n",
    "        encoder_embedded = tf.nn.embedding_lookup(encoder_embedding, self.X)\n",
    "        \n",
    "        for n in range(num_layers):\n",
    "            (out_fw, out_bw), (state_fw, state_bw) = tf.nn.bidirectional_dynamic_rnn(\n",
    "                cell_fw = cells(size_layer // 2),\n",
    "                cell_bw = cells(size_layer // 2),\n",
    "                inputs = encoder_embedded,\n",
    "                sequence_length = self.X_seq_len,\n",
    "                dtype = tf.float32,\n",
    "                scope = 'bidirectional_rnn_%d'%(n))\n",
    "            encoder_embedded = tf.concat((out_fw, out_bw), 2)\n",
    "        \n",
    "        bi_state_c = tf.concat((state_fw.c, state_bw.c), -1)\n",
    "        bi_state_h = tf.concat((state_fw.h, state_bw.h), -1)\n",
    "        bi_lstm_state = tf.nn.rnn_cell.LSTMStateTuple(c=bi_state_c, h=bi_state_h)\n",
    "        encoder_state = tuple([bi_lstm_state] * num_layers)\n",
    "        \n",
    "        main = tf.strided_slice(self.Y, [0, 0], [batch_size, -1], [1, 1])\n",
    "        decoder_input = tf.concat([tf.fill([batch_size, 1], GO), main], 1)\n",
    "        dense = tf.layers.Dense(to_dict_size)\n",
    "        decoder_cells = tf.nn.rnn_cell.MultiRNNCell([cells() for _ in range(num_layers)])\n",
    "        \n",
    "        training_helper = tf.contrib.seq2seq.TrainingHelper(\n",
    "                inputs = tf.nn.embedding_lookup(decoder_embedding, decoder_input),\n",
    "                sequence_length = self.Y_seq_len,\n",
    "                time_major = False)\n",
    "        training_decoder = tf.contrib.seq2seq.BasicDecoder(\n",
    "                cell = decoder_cells,\n",
    "                helper = training_helper,\n",
    "                initial_state = encoder_state,\n",
    "                output_layer = dense)\n",
    "        training_decoder_output, _, _ = tf.contrib.seq2seq.dynamic_decode(\n",
    "                decoder = training_decoder,\n",
    "                impute_finished = True,\n",
    "                maximum_iterations = tf.reduce_max(self.Y_seq_len))\n",
    "        self.training_logits = training_decoder_output.rnn_output\n",
    "        \n",
    "        predicting_helper = tf.contrib.seq2seq.GreedyEmbeddingHelper(\n",
    "                embedding = decoder_embedding,\n",
    "                start_tokens = tf.tile(tf.constant([GO], dtype=tf.int32), [batch_size]),\n",
    "                end_token = EOS)\n",
    "        predicting_decoder = tf.contrib.seq2seq.BasicDecoder(\n",
    "                cell = decoder_cells,\n",
    "                helper = predicting_helper,\n",
    "                initial_state = encoder_state,\n",
    "                output_layer = dense)\n",
    "        predicting_decoder_output, _, _ = tf.contrib.seq2seq.dynamic_decode(\n",
    "                decoder = predicting_decoder,\n",
    "                impute_finished = True,\n",
    "                maximum_iterations = 2 * tf.reduce_max(self.X_seq_len))\n",
    "        self.predicting_ids = predicting_decoder_output.sample_id\n",
    "        \n",
    "        masks = tf.sequence_mask(self.Y_seq_len, tf.reduce_max(self.Y_seq_len), dtype=tf.float32)\n",
    "        self.cost = tf.contrib.seq2seq.sequence_loss(logits = self.training_logits,\n",
    "                                                     targets = self.Y,\n",
    "                                                     weights = masks)\n",
    "        self.optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate).minimize(self.cost)\n",
    "        y_t = tf.argmax(self.training_logits,axis=2)\n",
    "        y_t = tf.cast(y_t, tf.int32)\n",
    "        self.prediction = tf.boolean_mask(y_t, masks)\n",
    "        mask_label = tf.boolean_mask(self.Y, masks)\n",
    "        correct_pred = tf.equal(self.prediction, mask_label)\n",
    "        correct_index = tf.cast(correct_pred, tf.float32)\n",
    "        self.accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "size_layer = 512\n",
    "num_layers = 2\n",
    "embedded_size = 256\n",
    "learning_rate = 1e-3\n",
    "batch_size = 128\n",
    "epoch = 20"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING: Logging before flag parsing goes to stderr.\n",
      "W0902 18:09:45.672424 140511355651904 deprecation.py:506] From /home/husein/.local/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py:507: calling count_nonzero (from tensorflow.python.ops.math_ops) with axis is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "reduction_indices is deprecated, use axis instead\n",
      "W0902 18:09:45.709759 140511355651904 deprecation.py:323] From <ipython-input-10-a462f9f5a02f>:10: LSTMCell.__init__ (from tensorflow.python.ops.rnn_cell_impl) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "This class is equivalent as tf.keras.layers.LSTMCell, and will be replaced by that in Tensorflow 2.0.\n",
      "W0902 18:09:45.711711 140511355651904 deprecation.py:323] From <ipython-input-10-a462f9f5a02f>:30: bidirectional_dynamic_rnn (from tensorflow.python.ops.rnn) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use `keras.layers.Bidirectional(keras.layers.RNN(cell))`, which is equivalent to this API\n",
      "W0902 18:09:45.712890 140511355651904 deprecation.py:323] From /home/husein/.local/lib/python3.6/site-packages/tensorflow/python/ops/rnn.py:464: dynamic_rnn (from tensorflow.python.ops.rnn) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use `keras.layers.RNN(cell)`, which is equivalent to this API\n",
      "W0902 18:09:45.883166 140511355651904 deprecation.py:506] From /home/husein/.local/lib/python3.6/site-packages/tensorflow/python/ops/rnn_cell_impl.py:961: calling Zeros.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Call initializer instance with the dtype argument instead of passing it to the constructor\n",
      "W0902 18:09:46.477952 140511355651904 deprecation.py:323] From /home/husein/.local/lib/python3.6/site-packages/tensorflow/python/ops/rnn.py:244: add_dispatch_support.<locals>.wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use tf.where in 2.0, which has the same broadcast rule as np.where\n",
      "W0902 18:09:47.018548 140511355651904 deprecation.py:323] From <ipython-input-10-a462f9f5a02f>:41: MultiRNNCell.__init__ (from tensorflow.python.ops.rnn_cell_impl) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "This class is equivalent as tf.keras.layers.StackedRNNCells, and will be replaced by that in Tensorflow 2.0.\n",
      "W0902 18:09:47.779454 140511355651904 lazy_loader.py:50] \n",
      "The TensorFlow contrib module will not be included in TensorFlow 2.0.\n",
      "For more information, please see:\n",
      "  * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md\n",
      "  * https://github.com/tensorflow/addons\n",
      "  * https://github.com/tensorflow/io (for I/O related ops)\n",
      "If you depend on functionality not listed there, please file an issue.\n",
      "\n",
      "W0902 18:09:48.201711 140511355651904 deprecation.py:506] From /home/husein/.local/lib/python3.6/site-packages/tensorflow/python/ops/init_ops.py:1251: calling VarianceScaling.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Call initializer instance with the dtype argument instead of passing it to the constructor\n"
     ]
    }
   ],
   "source": [
    "tf.reset_default_graph()\n",
    "sess = tf.InteractiveSession()\n",
    "model = Translator(size_layer, num_layers, embedded_size, len(dictionary_from), \n",
    "                len(dictionary_to), learning_rate,batch_size)\n",
    "sess.run(tf.global_variables_initializer())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def str_idx(corpus, dic):\n",
    "    X = []\n",
    "    for i in corpus:\n",
    "        ints = []\n",
    "        for k in i.split():\n",
    "            ints.append(dic.get(k,UNK))\n",
    "        X.append(ints)\n",
    "    return X\n",
    "\n",
    "def pad_sentence_batch(sentence_batch, pad_int):\n",
    "    padded_seqs = []\n",
    "    seq_lens = []\n",
    "    max_sentence_len = max([len(sentence) for sentence in sentence_batch])\n",
    "    for sentence in sentence_batch:\n",
    "        padded_seqs.append(sentence + [pad_int] * (max_sentence_len - len(sentence)))\n",
    "        seq_lens.append(len(sentence))\n",
    "    return padded_seqs, seq_lens"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_X = str_idx(train_X, dictionary_from)\n",
    "test_X = str_idx(test_X, dictionary_from)\n",
    "train_Y = str_idx(train_Y, dictionary_to)\n",
    "test_Y = str_idx(test_Y, dictionary_to)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [10:15<00:00,  1.69it/s, accuracy=0.157, cost=5.55]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:05<00:00,  4.18it/s, accuracy=0.175, cost=5.1] \n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 1, training avg loss 5.970781, training avg acc 0.111191\n",
      "epoch 1, testing avg loss 5.046552, testing avg acc 0.192169\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [10:20<00:00,  1.68it/s, accuracy=0.252, cost=4.6] \n",
      "minibatch loop: 100%|██████████| 23/23 [00:05<00:00,  4.47it/s, accuracy=0.271, cost=4.43]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 2, training avg loss 4.510838, training avg acc 0.259962\n",
      "epoch 2, testing avg loss 4.260819, testing avg acc 0.289507\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [10:14<00:00,  1.70it/s, accuracy=0.304, cost=4]   \n",
      "minibatch loop: 100%|██████████| 23/23 [00:05<00:00,  4.46it/s, accuracy=0.294, cost=4.12]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 3, training avg loss 3.914677, training avg acc 0.324567\n",
      "epoch 3, testing avg loss 3.931807, testing avg acc 0.323940\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [10:13<00:00,  1.70it/s, accuracy=0.34, cost=3.48] \n",
      "minibatch loop: 100%|██████████| 23/23 [00:05<00:00,  4.45it/s, accuracy=0.322, cost=3.94]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 4, training avg loss 3.575185, training avg acc 0.357548\n",
      "epoch 4, testing avg loss 3.754569, testing avg acc 0.343392\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [10:14<00:00,  1.70it/s, accuracy=0.414, cost=3.06]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:05<00:00,  4.41it/s, accuracy=0.35, cost=3.82] \n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 5, training avg loss 3.330248, training avg acc 0.381959\n",
      "epoch 5, testing avg loss 3.653602, testing avg acc 0.354871\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [10:14<00:00,  1.70it/s, accuracy=0.45, cost=2.67] \n",
      "minibatch loop: 100%|██████████| 23/23 [00:05<00:00,  4.45it/s, accuracy=0.367, cost=3.76]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 6, training avg loss 3.133144, training avg acc 0.403404\n",
      "epoch 6, testing avg loss 3.595912, testing avg acc 0.363180\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [10:14<00:00,  1.70it/s, accuracy=0.501, cost=2.34]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:05<00:00,  4.44it/s, accuracy=0.345, cost=3.72]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 7, training avg loss 2.965709, training avg acc 0.423420\n",
      "epoch 7, testing avg loss 3.571016, testing avg acc 0.363791\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [10:13<00:00,  1.70it/s, accuracy=0.551, cost=2.06]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:05<00:00,  4.46it/s, accuracy=0.362, cost=3.69]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 8, training avg loss 2.823528, training avg acc 0.441742\n",
      "epoch 8, testing avg loss 3.574800, testing avg acc 0.365062\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [10:14<00:00,  1.70it/s, accuracy=0.613, cost=1.82]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:05<00:00,  4.45it/s, accuracy=0.373, cost=3.72]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 9, training avg loss 2.701266, training avg acc 0.458267\n",
      "epoch 9, testing avg loss 3.596141, testing avg acc 0.363108\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [10:15<00:00,  1.69it/s, accuracy=0.644, cost=1.61]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:05<00:00,  4.44it/s, accuracy=0.333, cost=3.8] \n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 10, training avg loss 2.594976, training avg acc 0.473309\n",
      "epoch 10, testing avg loss 3.624912, testing avg acc 0.361898\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [10:31<00:00,  1.65it/s, accuracy=0.683, cost=1.43]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:05<00:00,  4.47it/s, accuracy=0.333, cost=3.86]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 11, training avg loss 2.496064, training avg acc 0.488037\n",
      "epoch 11, testing avg loss 3.653283, testing avg acc 0.360345\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [10:14<00:00,  1.70it/s, accuracy=0.724, cost=1.28]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:05<00:00,  4.52it/s, accuracy=0.339, cost=3.9] \n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 12, training avg loss 2.406763, training avg acc 0.501590\n",
      "epoch 12, testing avg loss 3.683764, testing avg acc 0.358175\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [10:14<00:00,  1.69it/s, accuracy=0.766, cost=1.14]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:05<00:00,  4.48it/s, accuracy=0.328, cost=3.89]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 13, training avg loss 2.325106, training avg acc 0.514291\n",
      "epoch 13, testing avg loss 3.724835, testing avg acc 0.357250\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [10:16<00:00,  1.69it/s, accuracy=0.789, cost=1.04]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:05<00:00,  4.47it/s, accuracy=0.356, cost=3.91]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 14, training avg loss 2.253128, training avg acc 0.525608\n",
      "epoch 14, testing avg loss 3.753395, testing avg acc 0.359052\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [10:07<00:00,  1.72it/s, accuracy=0.816, cost=0.945]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  4.67it/s, accuracy=0.339, cost=4]   \n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 15, training avg loss 2.184553, training avg acc 0.536910\n",
      "epoch 15, testing avg loss 3.796028, testing avg acc 0.356730\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [09:57<00:00,  1.74it/s, accuracy=0.841, cost=0.843]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:05<00:00,  4.57it/s, accuracy=0.316, cost=3.99]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 16, training avg loss 2.119450, training avg acc 0.547912\n",
      "epoch 16, testing avg loss 3.852276, testing avg acc 0.350685\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [09:51<00:00,  1.76it/s, accuracy=0.845, cost=0.78]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:05<00:00,  4.56it/s, accuracy=0.333, cost=4.08]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 17, training avg loss 2.063565, training avg acc 0.557289\n",
      "epoch 17, testing avg loss 3.908022, testing avg acc 0.349420\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [09:48<00:00,  1.77it/s, accuracy=0.877, cost=0.693]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:05<00:00,  4.55it/s, accuracy=0.311, cost=4.21]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 18, training avg loss 1.989629, training avg acc 0.571046\n",
      "epoch 18, testing avg loss 3.979372, testing avg acc 0.344861\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [09:31<00:00,  1.82it/s, accuracy=0.898, cost=0.624]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:05<00:00,  4.52it/s, accuracy=0.339, cost=4.14]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 19, training avg loss 1.929209, training avg acc 0.581917\n",
      "epoch 19, testing avg loss 4.030926, testing avg acc 0.344720\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [09:32<00:00,  1.82it/s, accuracy=0.906, cost=0.563]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:05<00:00,  4.47it/s, accuracy=0.35, cost=4.2]  "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 20, training avg loss 1.878075, training avg acc 0.590747\n",
      "epoch 20, testing avg loss 4.078696, testing avg acc 0.342469\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "import tqdm\n",
    "\n",
    "for e in range(epoch):\n",
    "    pbar = tqdm.tqdm(\n",
    "        range(0, len(train_X), batch_size), desc = 'minibatch loop')\n",
    "    train_loss, train_acc, test_loss, test_acc = [], [], [], []\n",
    "    for i in pbar:\n",
    "        index = min(i + batch_size, len(train_X))\n",
    "        maxlen = max([len(s) for s in train_X[i : index] + train_Y[i : index]])\n",
    "        batch_x, seq_x = pad_sentence_batch(train_X[i : index], PAD)\n",
    "        batch_y, seq_y = pad_sentence_batch(train_Y[i : index], PAD)\n",
    "        feed = {model.X: batch_x,\n",
    "                model.Y: batch_y}\n",
    "        accuracy, loss, _ = sess.run([model.accuracy,model.cost,model.optimizer],\n",
    "                                    feed_dict = feed)\n",
    "        train_loss.append(loss)\n",
    "        train_acc.append(accuracy)\n",
    "        pbar.set_postfix(cost = loss, accuracy = accuracy)\n",
    "    \n",
    "    \n",
    "    pbar = tqdm.tqdm(\n",
    "        range(0, len(test_X), batch_size), desc = 'minibatch loop')\n",
    "    for i in pbar:\n",
    "        index = min(i + batch_size, len(test_X))\n",
    "        batch_x, seq_x = pad_sentence_batch(test_X[i : index], PAD)\n",
    "        batch_y, seq_y = pad_sentence_batch(test_Y[i : index], PAD)\n",
    "        feed = {model.X: batch_x,\n",
    "                model.Y: batch_y,}\n",
    "        accuracy, loss = sess.run([model.accuracy,model.cost],\n",
    "                                    feed_dict = feed)\n",
    "\n",
    "        test_loss.append(loss)\n",
    "        test_acc.append(accuracy)\n",
    "        pbar.set_postfix(cost = loss, accuracy = accuracy)\n",
    "    \n",
    "    print('epoch %d, training avg loss %f, training avg acc %f'%(e+1,\n",
    "                                                                 np.mean(train_loss),np.mean(train_acc)))\n",
    "    print('epoch %d, testing avg loss %f, testing avg acc %f'%(e+1,\n",
    "                                                              np.mean(test_loss),np.mean(test_acc)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "rev_dictionary_to = {int(k): v for k, v in rev_dictionary_to.items()}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(20, 198)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_size = 20\n",
    "\n",
    "batch_x, seq_x = pad_sentence_batch(test_X[: test_size], PAD)\n",
    "batch_y, seq_y = pad_sentence_batch(test_Y[: test_size], PAD)\n",
    "feed = {model.X: batch_x}\n",
    "logits = sess.run(model.predicting_ids, feed_dict = feed)\n",
    "logits.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 predict: Làm sao để nói về cách nói về cách thức <NUM> của thế hệ này , phụ nữ nhất trong cuộc sống của tôi đã trải qua một môi trường lớn nhất liên quan đến việc nâng cấp từ San Francisco , và cô ấy nói với tôi rằng : \" Cô bé đã sống trong một thế giới nhỏ hơn , rồi lại không có gì để lại ở đó , kể cả khi chị đến từ Colombia , cô đã bao giờ nghe tiếng Anh ở khoảng cách giữa hai phút ở San Francisco và nhanh nhất ? Khi còn có thể đi qua được <NUM> phút ở Ấn Độ và bạn sẽ đi qua hơn một ngàn năm qua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
      "0 actual: Làm sao tôi có thể trình bày trong <NUM> phút về sợi dây liên kết những người phụ nữ qua ba thế hệ , về việc làm thế nào những sợi dây mạnh mẽ đáng kinh ngạc ấy đã níu chặt lấy cuộc sống của một cô bé bốn tuổi co quắp với đứa em gái nhỏ của cô bé , với mẹ và bà trong suốt năm ngày đêm trên con thuyền nhỏ lênh đênh trên Biển Đông hơn <NUM> năm trước , những sợi dây liên kết đã níu lấy cuộc đời cô bé ấy và không bao giờ rời đi - - cô bé ấy giờ sống ở San Francisco và đang nói chuyện với các bạn hôm nay ?\n",
      "\n",
      "1 predict: Không có câu chuyện đó . Không có câu chuyện nào cả . \" . . . . . . . . . . . . . . . \" bất kể là bất cứ thứ gì . \" . . . \" chỉ là kết thúc . \" . . . . . . . . . . . . . . \" chỉ là kết thúc kể từ đó . \" . . . . . . \" . . \" chỉ là kết hợp bình lặng . \" . . . . . . \" chỉ một không gian . \" . . . \" . . . \" chỉ quay lại với nhau . \" . . . \" . . . \" . . . \" chỉ quay lại . \" . . . \" . . . \" - - chỉ . \" . . . . . . . . . \" - - không . \" . . . . . . . . . . . \" chỉ quay lại với nhau . \" . . . \" - - chỉ là kết hợp bình thản . \" .\n",
      "1 actual: Câu chuyện này chưa kết thúc .\n",
      "\n",
      "2 predict: Câu chuyện của hai câu chuyện vẫn còn đang giao tiếp với nhau . . . . . . \" . . . \" . . . \" . . . \" . . . \" . . . . . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . \" . \" . \" . \" . \" . \" . \" . . \" . \" . . \" \" chỉ là kết quả quay ngược lại . \" . \" . . \" \" \" \" \" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
      "2 actual: Nó là một trò chơi ghép hình vẫn đang được xếp .\n",
      "\n",
      "3 predict: Tôi sẽ kể cho các bạn một vài số liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
      "3 actual: Hãy để tôi kể cho các bạn về vài mảnh ghép nhé .\n",
      "\n",
      "4 predict: Hãy tưởng tượng điều đầu tiên : người đàn ông : người sống trong đời sống của mình . Hãy làm cho cuộc sống của anh ta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
      "4 actual: Hãy tưởng tượng mảnh đầu tiên : một người đàn ông đốt cháy sự nghiệp cả đời mình .\n",
      "\n",
      "5 predict: Anh ấy là một người đàn ông tên là Jean - len , một niềm tin vào sự tự do của chính mình trong chính quyền và chính trị của mình . Tất cả những người đàn ông của mình là quyền lực . \" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . \" \" chính là đức tin . \" . . . \" cũng như vậy . \" . . . \" đó là điều không thể tránh khỏi . \" \" Không chỉ là vậy . \" . . . \" . . . \" - - xin lỗi cho lắm . \" . . \" . . . \" chỉ là một lời khen ngợi . \" . \" . . . \" chỉ là một lời khen ngợi . \" . \" . \" . \" . \" . \" . . \" chỉ là một lời khen ngợi . \"\n",
      "5 actual: Ông là nhà thơ , nhà viết kịch , một người mà cả cuộc đời chênh vênh trên tia hi vọng duy nhất rằng đất nước ông sẽ độc lập tự do .\n",
      "\n",
      "6 predict: Hãy nhìn vào việc ông ấy mang theo một cách hoàn toàn mới để suy nghĩ rằng đó là một sự tồn tại . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . \" với sự tự do đó . \" . \" . . \" . . \" . \" . \" . \" . \" . \" . \" . \" . \" . \" . \" . \" . \" . \" - - \" đó là điều gì đó với nó . \" \" \" Không chỉ là kết quả . \" . \" . \" . \"\n",
      "6 actual: Hãy tưởng tượng ông , một người cộng sản tiến vào , đối diện sự thật rằng cả cuộc đời ông đã phí hoài .\n",
      "\n",
      "7 predict: Từ từ này , bạn bè anh chị , anh em . . . . . chưa từng là người anh hùng . \" . . . . . . . \" vì anh chị ấy . \" . . \" vì vậy thôi . \" . . . \" . . . \" - - \" . . . \" . . . \" - - \" . . . . . \" - - - - - - - - - - xin chào đón đến vậy . \" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
      "7 actual: Ngôn từ , qua bao năm tháng là bạn đồng hành với ông , giờ quay ra chế giễu ông .\n",
      "\n",
      "8 predict: Anh ấy im lặng qua hoà nhạc . . . . . . . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . . \" . . \" . . . \" - - \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . \" . . . \"\n",
      "8 actual: Ông rút lui vào yên lặng .\n",
      "\n",
      "9 predict: Ông ấy đã bị liệt dần qua thời gian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . \" đó là sự tự do của nó . \" . . . \" đó không hề tồn tại được . \" . . . \" \" sâu xa hơn \" . \" . . \" . . \" . . \" . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . . . . . . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
      "9 actual: Ông qua đời , bị lịch sử quật ngã .\n",
      "\n",
      "10 predict: Anh ấy là ông của ông . \" . . . \" anh ta là người anh ấy . \" . . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" - - thế nào . \" . . \" - - \" . . . \" - - \" . . . \" - - - - \" . . . \" - - \" . . . \" - - \" . . . \" - - \" . . . \" - - \" . . . \" - - \" . . . \" - - \" . . . \" - - \" . . . \" - - \" . . . \" - - \" . . . \" . . \" - - \" . . . \" - - \" . . . \" - - \" . . . \" - - \" . . . \" - - \" . . . \" - - \" . . . \" - - \" . . . . \" - -\n",
      "10 actual: Ông là ông của tôi .\n",
      "\n",
      "11 predict: Tôi không bao giờ biết được mình thực sự sống ở đó . \" . . . . . \" . . . \" ngày nay . \" . . . \" . . . \" . . . \" . . . \" - - \" đó là một sự sống . \" . . . \" . . \" . . \" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n",
      "11 actual: Tôi chưa bao giờ gặp ông ngoài đời .\n",
      "\n",
      "12 predict: Nhưng chúng ta sống trong cuộc sống của chúng ta hơn là những cơn đau của chúng ta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . \" . . \" - - \" - - \" - - \" - - - - - - - - \" - - \" - - điều đó dẫn đến hơn . \" . . . \" đó là điều cần đến đó . \" . . \" . . \" chỉ nhớ thêm nữa . \" - - \" . . . \" . . \" - - \" . . . \" - - \" . . . \" - - ít đi hơn . \" . . .\n",
      "12 actual: Nhưng cuộc đời ta nhiều hơn những gì ta lưu trong kí ức nhiều .\n",
      "\n",
      "13 predict: Cha tôi không bao giờ quên anh ấy về cuộc sống của tôi . \" . . . . . . . \" - - \" . . . \" . . \" . . \" . . \" \" . . \" . . \" \" . . \" . \" . . \" \" Quay trở lại . \" . . \" - - chưa đến . \" đó là nơi duy nhất . \" . . . \" - - đó là sự phục hồi . \" . . . \" - - đó là sự phục hồi . \" . . . \" . . \" - - điều đó còn tươi đẹp . \" . . . \" chưa bao giờ . \" . . . \" . . . \" . . \" . . \" \" Quay trở lại . \" . . . \" . . \" . . \" . . \" . . \" . . . \" . . . \" . . \" - - \" . . . \" . . . \" . . \" - - \" . . . \" . .\n",
      "13 actual: Bà tôi chưa bao giờ cho phép tôi quên cuộc đời của ông .\n",
      "\n",
      "14 predict: Mục đích của tôi không phải là để cho ra đời , và vì vậy , tôi e rằng chúng ta nên bị mắc chứng cho lắm , nhưng chúng ta lại bị mắc kẹt . . . . . . . \" ồn ào hơn . \" . . . \" . . \" . . \" - - chúng ta nói rằng ít nhất là nói về quá trình . \" . . . \" . . . \" . . \" . . \" . . \" . . \" . . \" . . \" . \" - - \" . . . \" . . \" - - - - - - - - - - - \" . . \" . . \" - - \" . . . \" . . \" . . \" - - - - - - \" . . . \" . . \" . . \" - - - - \" . . . \" . . \" - - - - \" . . . \" . . . \" - - - - \" . . . \" . . \" - -\n",
      "14 actual: Nhiệm vụ của tôi là không để cuộc đời ấy qua trong vô vọng , và bài học của tôi là nhận ra rằng , vâng , lịch sử đã cố quật ngã chúng tôi , nhưng chúng tôi đã chịu đựng được .\n",
      "\n",
      "15 predict: Khung tiếp theo trong cuộc đua maratông đang trôi qua trong một nhà máy đang chạy ngang qua . cái cửa sổ cá mập khổng lồ . . . . . . . . . . . . . . . . . . sâu trên lưng . \" . . . . . sâu sâu trên lưng tường . \" . . . \" quay lưng lại với nhau . \" . . . \" . . . \" \" quay lưng . \" . . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . . \" . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \" . . . \"\n",
      "15 actual: Mảnh ghép tiếp theo của tấm hình là một con thuyền trong sớm hoàng hôn lặng lẽ trườn ra biển .\n",
      "\n",
      "16 predict: Mẹ tôi , tuổi <NUM> , khi tôi sống ở một trại đàn ông , một cậu bé <NUM> tuổi , đã gặp nhau hai lần . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . \" một câu chuyện khác làm cha mẹ . \" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
      "16 actual: Mẹ tôi , Mai , mới <NUM> tuổi khi ba của mẹ mất - - đã lập gia đình , một cuộc hôn nhân sắp đặt trước , đã có hai cô con gái nhỏ .\n",
      "\n",
      "17 predict: Với cô , cô đã nhận được cuộc đời mình để trải nghiệm cuộc sống của cô về một cuộc hôn nhân và gia đình khác . \" vào tháng <NUM> cô ấy có ở lại với nhau . \" ở Úc . \" . . . . . . . . . . . . . . . . \" . . . \" . . . \" . . . . . . . \" . . . \" . . . \" . ít nữa . \" . . . \" . . . . . . . . . . . . . . . . . . . . . \" Quay lại . \" . . . \" chỉ với các cô gái khác . \" . \" . \" chỉ để duy trì được . \" . . . \" . . \" chỉ với cô ấy . \" . Quay trở lại từ đó . \" . . . \" chỉ từ thiện . \" . . . \" . . . \" . . . \" . . . \" . . . \" chỉ là duy trì một\n",
      "17 actual: Với mẹ , cuộc đời cô đọng vào nhiệm vụ duy nhất : để gia đình mẹ trốn thoát và bắt đầu cuộc sống mới ở Úc .\n",
      "\n",
      "18 predict: Nó vẫn còn đuổi kịp với vợ mình không tự nhiên . . . . . . . . . . . . . . . \" \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . \" . . . \" . . . \" - - thế đấy . \" - - xin chào đón riêng của mình . \" . . . \" . . . \" - - \" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . \" . . \" . . . . . \" . . . . . \" . . . . . \" . . . . . \" . . .\n",
      "18 actual: Mẹ không bao giờ chấp nhận được là mẹ sẽ không thành công .\n",
      "\n",
      "19 predict: Sau một hồi chuông hồi phục , một cơn ác mộng , một cơn ác mộng , đã được sử dụng khi được đi qua chặng đường . để đánh răng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . \" bất kỳ chuyện gì đã xảy ra với chúng . \" .\n",
      "19 actual: Thế là sau bốn năm , một trường thiên đằng đẵng hơn cả trong truyện , một chiếc thuyền trườn ra biển nguỵ trang là thuyền đánh cá .\n",
      "\n"
     ]
    }
   ],
   "source": [
    "rejected = ['PAD', 'EOS', 'UNK', 'GO']\n",
    "\n",
    "for i in range(test_size):\n",
    "    predict = [rev_dictionary_to[i] for i in logits[i] if rev_dictionary_to[i] not in rejected]\n",
    "    actual = [rev_dictionary_to[i] for i in batch_y[i] if rev_dictionary_to[i] not in rejected]\n",
    "    print(i, 'predict:', ' '.join(predict))\n",
    "    print(i, 'actual:', ' '.join(actual))\n",
    "    print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
